#第十章 函数的高级特性

#例10-1 for循环遍历列表。
list01 = [1,2,3,4]
for item in list01:
    print(item,end=" ")

#10.5装饰器
#例10-22 定义返回值是函数的高阶函数。
def func01():
    print("func01()函数")
def func02():
    print("func02()函数")
    return func01
func = func02()
func()

#例10-23 将func01()函数定义在fun02()函数的内部。
def func02():
    print("func02()函数")
    def func01():
        print("func01()函数")
    return func01
func = func02()
func()

#例10-24 内部函数对外部函数的参数进行操作的情况。
def func02(x):
    def func01():
        return x+2
    return func01
func = func02(1)
print(func())

#例10-25 增加func()函数的功能。
def func02(func):
    def func01():
        x = func()
        return x+1
    return func01
def func():
    print("func()函数 ")
    return 1
print(func())
decorated = func02(func)
print(decorated()) 

#例10-26 增加func()函数的功能。
def func02(func):
    def func01():
        return func()+1
    return func01
def func():
    print("func()函数 ")
    return 1
func = func02(func)
print(func())

#例10-27 @符号的应用。
def func02(func):
    def func01():
        return func()+1
    return func01
@func02
def func():
    print("func()函数 ")
    return 1
print(func())

#例10-28 装饰器装饰有参数的函数。
def func02(func):
    def func01(a,b):
        return func(a+1,b+1)
    return func01
@func02
def func(a,b):
    print("func()函数 ")
    return a**2 + b**2
print(func(1,1))    

#例10-29 带参数的装饰器。
def outer(arg):
    def func02(func):
        def func01(x):
            print(arg)
            print("装饰器发挥作用")
            return func(x)**2
        return func01
    return func02
@outer("这是一个带参数的装饰器")
def func(x):
    print("调用func()函数")
    return x
print(func(2))

#例10-30 带参数的装饰器。
def outer(arg):
    def func02(func):
        def func01(x):
            print(arg)
            print("装饰器发挥作用")
            return func(x)**2
        return func01
    return func02
def func(x):
    print("调用func()函数")
    return x
func02 = outer("这是一个带参数的装饰器")
func = func02(func)
print(func(2))

#例10-31 装饰器验证用户登录信息。
username="小千"
password="xiaoqian123"
user_status=False
type=input("请输入登入方式(社交账号或博客账号)：")
def login(login_type):
    def check(func):
        def wrapper(*args,**kwargs):
            global user_status
            if not user_status:
                if login_type=="社交账号" or login_type=="博客账号":
                    user=input("请输入用户名：")
                    pwd=input("请输入密码：")
                    if user==username and pwd==password:
                        user_status=True
                    else:
                        print("用户名或密码错误")
                else:
                    print("此登入方式无法使用！")
            if user_status:
                return func(*args,**kwargs)
        return wrapper
    return check
@login(type)
def chat():
    print("聊天")
@login(type)
def shop():
    print("购物")
if __name__=="__main__":
    chat()
    shop()